/*
	Programação Concorrente
	Trabalho 1
	Turma A

	Adilson Rapozo
	Luiz Bertoni
	Rodrigo Costa
*/

#include "../util/util.h"
#include <math.h>
#include <string.h>
#include <time.h>

int main (void){

    /*declarações*/
	mpf_t x,xi,xr,y,yi,z,aux;
	int iteracao;
	FILE *fp,*fp2;

	float desempenho;
    	clock_t start,end;
        char pi[10];

	/*definindo a precisão a ser utilizada*/
	mpf_set_default_prec(PRECISION_FOR_10M);

    /*prepara as variaveis para serem utilizadas*/
	mpf_init(x);
        mpf_init(xi);
        mpf_init(xr);
        mpf_init(y);
        mpf_init(yi);
        mpf_init(z);
        mpf_init(aux);
	mpf_sqrt_ui(xi,2);
        mpf_add_ui(z,xi,2);


	/*obtem o tempo inicial para o calculo de desempenho*/
	start = clock();
    fp2 = fopen(REAL_PI,"r");

        for(iteracao=0; iteracao <= 24; iteracao++){

                mpf_set(x,xi);
                mpf_sqrt(xr,x);
                mpf_ui_div(xi,1,xr);
                mpf_add(xi,xr,xi);
                mpf_div_ui(xi,xi,2);

                mpf_set(y,yi);
                mpf_add_ui(yi,y,1);
                mpf_mul(yi,xr,yi);
                mpf_add(aux,x,y);
                mpf_div(yi,yi,aux);
                mpf_add_ui(aux,xi,1);
                mpf_mul(aux,z,aux);
                mpf_mul(aux,aux,yi);

                mpf_add_ui(z,yi,1);
                mpf_div(z,aux,z);

                /*salva arquivo*/
                savePI(&fp,"b_seq",z,(unsigned long)iteracao);

                /*Imprime quantidade de digitos corretos*/
                printf("Obtained %lu correct digits in iteration #%d.\n",compare(fp,fp2),iteracao);

                fclose(fp);
        }
        fclose(fp2);

        /*obtem o tempo após o processamento do algoritmo para o calculo de desempenho*/
        end = clock();

        /*calculo do desempenho*/
        desempenho =((double)(end-start))/CLOCKS_PER_SEC;

        /*Imprime tempo de execução*/
        printf("Sequential Borwein : %.8f seconds.\n",desempenho);

        /*limpa as variáveis utilizadas*/
        mpf_clear(x);
        mpf_clear(xi);
        mpf_clear(xr);
        mpf_clear(y);
        mpf_clear(yi);
        mpf_clear(z);
        mpf_clear(aux);

        return 0;
}
